// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// 下面的原始C代码、长注释和常量
// 来自FreeBSD的/usr/src/lib/msun/src/s_asinh.C 
// 并随附此通知。go代码是原始C.
// 
// ================================================================================================
// 版权所有（C）1993由Sun Microsystems，Inc.保留所有权利。
// 
// 由SunPro开发，SunPro是Sun Microsystems，Inc.的一家企业。
// 使用、复制、修改和分发本
// 软件的权限是免费授予的，前提是保留本通知
// 的权利。第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第十九部分：第十九部分：第十九部分：第十九部分：第七部分：第十九部分：第七部分：第七部分：第七部分：第十九部分：第七部分：第七部分：第七部分：第二部分：第七部分：第二部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第一,，如果x大于2，否则
// /:=sign（x）*:=sign（x）*:=sign（x）*:=sign（x）*:=log2

// 
// 特殊情况为：
// Asinh（±0）=±0 
// Asinh（±Inf）=±Inf 
// Asinh（NaN）=NaN 
func Asinh(x float64) float64 {
	if haveArchAsinh {
		return archAsinh(x)
	}
	return asinh(x)
}

func asinh(x float64) float64 {
	const (
		Ln2      = 6.93147180559945286227e-01 // 0x3FE62E42EFA39EF 
		NearZero = 1.0 / (1 << 28)            // 2**-28 
		Large    = 1 << 28                    // 2**28 
	)
	// 特殊情况
	if IsNaN(x) || IsInf(x, 0) {
		return x
	}
	sign := false
	if x < 0 {
		x = -x
		sign = true
	}
	var temp float64
	switch {
	case x > Large:
		temp = Log(x) + Ln2 // /|x |>2**28 
	case x > 2:
	case x < NearZero:
	default:
	}
	if sign {
		temp = -temp
	}
	return temp
}
